/********************************************************************************
 *解析所有试题json数据，将树形结构的数据分解成线性数据
 ********************************************************************************/
import G_Prg from './yingSoftPrg';
import G_Cookie from './yingSoftCookie';
import G_SetTestInfo from './yingSoftSetTest';
import { data } from './testDataJSON';
// import { replacePhoneID } from './andriodExam';
import { G_AjaxApi } from './ajax';

// var G_AllTest; // = new TestData(jsonAllTest); 
export default new TestData();
/********************************************************************************
函数名：OneTest
功能：一道试题的数据结构
输入参数: 无
返回值：无
创建信息：黎萍（2014-05-19）
修改记录：兰涛（2014-05-22）
审查人：韦友爱（2014-05-26）
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTest() {
    this.testNO = 0; //试题编号
    this.style = ''; //试题类型
    this.type = ''; //试题所属题型
    this.score = 0; //每题分数

    //以下三个索引用于定位json中的对应数据
    this.styleItemIndex = 0; // 题型ID,json数据中的StyleID
    this.testItemIndex = 0; // 大标题ID,json数据中各种题型的ID
    this.subTestItemIndex = -1; //小题ID,针对A3题型的A3TestItemIndex和B题型的BTestItemIndex; testNO 试题的编号

    //下面4个字段值用于记录用户在做题过程中的答题信息
    this.userReply = ''; //用户的答案
    this.isRight = false; //是否回答正确
    this.fav = false; //收藏
    this.userNote = ''; //用户笔记
    this.selected = 0; //标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
    this.state = 'uncommited'; //标记当前试题是否提交了答案：true为已提交，commited为未提交
    this.lastState = ''; //用户上一次操作试题的状态
    this.action = ''; //记录试题的当前操作
    this.lastAction = ''; //用户上一次操作试题的动作

    this.point = ''; //知识点
    this.tag = ''; //标签
    this.isShowExplain = false;//是否显示用户解析
    this.spendTime = 0;
}

/********************************************************************************
函数名：OneTestShow
功能：一道试题显示时的数据结构
输入参数：无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加注释及函数体中属性的操作
修改记录：黎萍（2014-06-24） 增加输入参数AllTestID,StyleID 并增加注释
修改记录：黎萍（2014-07-03） 增加输入参数cptID,sbjID,srcID,subTestID 并增加注释
修改记录：黎萍（2014-07-04） 增加输入参数score并增加注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTestShow() {
    this.cptID = 0; //章节ID
    this.sbjID = 0; //科目ID
    this.srcID = 0; //来源ID
    this.allTestID = 0; //试题的AllTestID
    this.styleID = 0; //试题类型ID
    this.testNO = 0; //试题编号
    this.testType = ''; //试题所属题型
    this.subTestType = ''; //小题所属题型
    this.testStyle = ''; //试题类型
    this.styleExplain = ''; //试题类型说明
    this.frontTitle = ''; //共用题干，针对A3Test
    this.title = ''; //试题标题
    this.selectedItems = ''; //试题选项
    this.answer = ''; //试题答案
    this.testPoint = ''; //考试重点
    this.explain = ''; //解题思路
    this.isFav = 0; //是否收藏
    this.userNote = ''; //用户笔记
    this.subTestID = -1; //小题id（针对A3题型、B题型）
    this.score = 0; //每题分数
    this.time = ''; //时间
    this.answerType = 0; //标记填空题答案是否按照顺序进行答案比对
    this.spendTime = 0;
}

/********************************************************************************
函数名：TestData
功能：试题数据
输入参数:无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加函数注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function TestData() {
    //私有变量
    var _index = 0; //试题数组索引
    var _jsonAllTest = {}; //试题json数据
    var _arrAllTest = []; //试题数组:数组元素为OneTest结构体：通过TestNO找到StyleItemIndex,TestItemIndex,SubTestItemIndex，然后再定位到_jsonAllTest中的对应数据
    var _isVip = 0; //标记是否是VIP用户
    var _examHistoryID = ''; //答题历史ID
    var _fromUrl = G_Prg.getQueryString('fromUrl');
    var _name = G_Prg.getQueryString('name');
    var _time = '';
    var _arrContrast = [];
    var _arrOtherNote = [];
    _init(); //初始化数据

    //私有函数
    /********************************************************************************
    函数名：_init
    功能：初始化试题数据
    输入参数:无
    返回值：无
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-13） 添加函数注释
    修改记录：黎萍（2014-06-13） 去掉参数jsonAllTest
              韦友爱（2014-07-23）添加callback回调函数，添加从章节最终列表页跳转传来的type参数的判断
              黎萍（2015-05-12）增加对执业护士的易混易错试题数据的获取控制
              黎萍（2015-06-23）修改对执业护士、临床执业医师、临床执业助理医师的易混易错取题方式，避免重复取题
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _init() {
        let appID = localStorage.getItem('AppID');
        let appEName = localStorage.getItem('ExamType');
        if (!appID || !appEName) {
            G_Prg.throw('程序运行错误，TestData._init : appID = "' + appID + '",获取数据出现异常');
        }
        /*var callback=function(){
            window.location.href = fromUrl+'?fromUrl=doExam.html';
        }
        var cptID=G_Cookie.getCptID();
        if(!cptID){
            G_Prg.throw('程序运行错误，TestData._init : cptID = "'+cptID+'",获取数据出现异常'); 
        }
        _jsonAllTest = _getAllTestJSON(cptID,appID,callback);//获取试题json数据*/
        // if (_name === 'sc' || _name === 'xxct') {
        //     _jsonAllTest = data;
        // }
        if (_name === 'xxct') {
            // _jsonAllTest = replacePhoneID;
            _jsonAllTest = getReplacePhoneID();
        } else if (_name === 'sc') {
            _jsonAllTest = getShouCangData(appEName);
        } else if (_name === 'nttz') {
            _jsonAllTest = getErrorRankData();
        } else if (_name === 'znlx') {
            _jsonAllTest = getRandomData();
        } else {
            _jsonAllTest = getKaoYanAppData(appID, appEName);
            // _jsonAllTest = data;
        }
        _initArrAllTest(); //初始化结构体数组

    }

    this.refreshgo = function() {
        _name = G_Prg.getQueryString('name');
        _init();
    };

    function getCookie(cookieName) {
        var value = null;
        var arr;
        var reg = new RegExp("(^| )" + cookieName + "=([^;]*)(;|$)");
        arr = document.cookie.match(reg);
        if (arr) {
            value = unescape(arr[2]);
        }
        return (value) ? value : null;
    }
    /********************************************************************************
    函数名：_initArrAllTest
    功能：初始化试题结构体数组
    输入参数: 无
    返回值：无
    创建信息：黎萍（2014-08-18）
    修改记录：无
    审查人：无
     *******************************************************************************/
    function _initArrAllTest() {
        _arrAllTest = [];
        if (_jsonAllTest === '' || !_jsonAllTest) {
            return;
        }
        var index = 0; //数组Numbers的索引
        //题型数据获取异常
        var styleItems = _jsonAllTest.StyleItems;
        if (styleItems.length === 0) {
            G_Prg.throw('程序运行错误，TestData._initArrAllTest ：styleItems = "' + styleItems + '"，无法解析试题数据包！');
        }
        if (_name === 'znlx') {
            styleItems.reverse();
        }
        for (var i = 0; i < styleItems.length; i++) {
            var testType = styleItems[i].Type;
            var testItems = styleItems[i].TestItems;
            if (_name === 'znlx') {
                testItems.reverse();
            }
            for (var j = 0; j < testItems.length; j++) {
                if (testType === 'A3TEST') {
                    var a3items = testItems[j].A3TestItems;
                    for (var k = 0; k < a3items.length; k++) {
                        var childTable = {
                            AllTestID: testItems[j].AllTestID,
                            ChildTableID: a3items[k].A3TestItemID
                        }
                        _arrAllTest[index] = new OneTest();
                        _arrAllTest[index].styleItemIndex = i;
                        _arrAllTest[index].testItemIndex = j;
                        _arrAllTest[index].subTestItemIndex = k;
                        _arrAllTest[index].testNO = index + 1;
                        _arrAllTest[index].style = styleItems[i].Style;
                        _arrAllTest[index].type = testType;
                        _arrAllTest[index].score = styleItems[i].Score;

                        _arrContrast[index] = parseInt(testItems[j].AllTestID + '' + a3items[k].A3TestItemID);
                        if (a3items[k].State === 'commited') {
                            _arrAllTest[index].state = a3items[k].State;
                            _arrAllTest[index].userReply = a3items[k].UserAnswer;
                            _arrAllTest[index].isRight = a3items[k].IsRight;
                        } else {
                            _arrAllTest[index].state = 'uncommited';
                            _arrAllTest[index].userReply = '';
                            _arrAllTest[index].isRight = false;
                        }
						if(a3items[k].ErrorReplyCount){
							_arrAllTest[index].errorReplyCount = a3items[k].ErrorReplyCount;
						}else{
							_arrAllTest[index].errorReplyCount = 0;
						}
                        if(a3items[k].RightReplyCount){
                        	_arrAllTest[index].rightReplyCount = a3items[k].RightReplyCount;
                        }else{
                        	_arrAllTest[index].rightReplyCount = 0;
                        }
                        
                        _arrAllTest[index].fav = a3items[k].IsFav;
                        _arrAllTest[index].userNote = a3items[k].UserNoteContent;
                        _arrAllTest[index].time = a3items[k].NoteTime;
                        _arrAllTest[index].userExplain = a3items[k].userExplain;
                        _arrAllTest[index].statisticsData = a3items[k].statisticsData;
                        _arrAllTest[index].discussCount = a3items[k].discussCount;
                        _arrAllTest[index].knowledgePoint = a3items[k].knowledgePoint;
                        _arrAllTest[index].unableNumber = a3items[k].concernCount;
                        _arrAllTest[index].doExamNumber = a3items[k].explainCount;

                        _arrAllTest[index].ypercent = a3items[k].Ypercent;
                        _arrAllTest[index].ytopReply = a3items[k].YtopReply;
                        _arrAllTest[index].isShowExplain = false;
                        _arrAllTest[index].spendTime = a3items[k].SpendTime ? a3items[k].SpendTime:0;
                        index++;
                    }
                } else if (testType === 'BTEST') {
                    var bitems = testItems[j].BTestItems;
                    for (var k = 0; k < bitems.length; k++) {
                        var childTable = {
                            AllTestID: testItems[j].AllTestID,
                            ChildTableID: bitems[k].BTestItemID
                        }
                        _arrAllTest[index] = new OneTest();
                        _arrAllTest[index].styleItemIndex = i;
                        _arrAllTest[index].testItemIndex = j;
                        _arrAllTest[index].subTestItemIndex = k;
                        _arrAllTest[index].testNO = index + 1;
                        _arrAllTest[index].style = styleItems[i].Style;
                        _arrAllTest[index].type = testType;
                        _arrAllTest[index].score = styleItems[i].Score;
                        _arrContrast[index] = parseInt(testItems[j].AllTestID + '' + bitems[k].BTestItemID);
                        if (bitems[k].State === 'commited') {
                            _arrAllTest[index].state = bitems[k].State;
                            _arrAllTest[index].userReply = bitems[k].UserAnswer;
                            _arrAllTest[index].isRight = bitems[k].IsRight;
                        } else {
                            _arrAllTest[index].state = 'uncommited';
                            _arrAllTest[index].userReply = '';
                            _arrAllTest[index].isRight = false;
                        }
                        if(bitems[k].ErrorReplyCount){
                        	_arrAllTest[index].errorReplyCount = bitems[k].ErrorReplyCount;
                        }else{
                        	_arrAllTest[index].errorReplyCount = 0 ;
                        }
                        if(bitems[k].RightReplyCount){
                        	_arrAllTest[index].rightReplyCount = bitems[k].RightReplyCount;
                        }else{
                        	_arrAllTest[index].rightReplyCount = 0;
                        }
                        _arrAllTest[index].fav = bitems[k].IsFav;
                        _arrAllTest[index].userNote = bitems[k].UserNoteContent;
                        _arrAllTest[index].time = bitems[k].NoteTime;
                        _arrAllTest[index].userExplain = bitems[k].userExplain;
                        _arrAllTest[index].statisticsData = bitems[k].statisticsData;
                        _arrAllTest[index].discussCount = bitems[k].discussCount;
                        _arrAllTest[index].knowledgePoint = bitems[k].knowledgePoint;
                        _arrAllTest[index].unableNumber = bitems[k].concernCount;
                        _arrAllTest[index].doExamNumber = bitems[k].explainCount;

                        _arrAllTest[index].ypercent = bitems[k].Ypercent;
                        _arrAllTest[index].ytopReply = bitems[k].YtopReply;
                        _arrAllTest[index].isShowExplain = false;
                        _arrAllTest[index].spendTime = bitems[k].SpendTime ? bitems[k].SpendTime :0;
                        index++;
                    }
                } else if (testType === 'ATEST' || testType === 'JDTEST' || testType === 'PDTEST' || testType === 'TKTEST' || testType === 'XTEST') {
                    var childTable = {
                        AllTestID: testItems[j].AllTestID,
                        ChildTableID: -1
                    }

                    _arrAllTest[index] = new OneTest();
                    _arrAllTest[index].styleItemIndex = i;
                    _arrAllTest[index].testItemIndex = j;
                    _arrAllTest[index].testNO = index + 1;
                    _arrAllTest[index].style = styleItems[i].Style;
                    _arrAllTest[index].type = testType;
                    _arrAllTest[index].score = styleItems[i].Score;

                    _arrContrast[index] = testItems[j].AllTestID;
                    if (testItems[j].State === 'commited') {
                        _arrAllTest[index].state = testItems[j].State;
                        _arrAllTest[index].userReply = testItems[j].UserAnswer;
                        _arrAllTest[index].isRight = testItems[j].IsRight;
                    } else {
                        _arrAllTest[index].state = 'uncommited';
                        _arrAllTest[index].userReply = '';
                        _arrAllTest[index].isRight = false;
                    }
                    if(testItems[j].ErrorReplyCount){
                    	_arrAllTest[index].errorReplyCount = testItems[j].ErrorReplyCount;
                    }else{
                    	_arrAllTest[index].errorReplyCount = 0;
                    }
                    if(testItems[j].RightReplyCount){
                    	_arrAllTest[index].rightReplyCount = testItems[j].RightReplyCount;
                    }else{
                    	_arrAllTest[index].rightReplyCount = 0;
                    }
                    _arrAllTest[index].fav = testItems[j].IsFav;
                    _arrAllTest[index].userNote = testItems[j].UserNoteContent;
                    _arrAllTest[index].time = testItems[j].NoteTime;
                    _arrAllTest[index].userExplain = testItems[j].userExplain;
                    _arrAllTest[index].statisticsData = testItems[j].statisticsData;
                    _arrAllTest[index].discussCount = testItems[j].discussCount;
                    _arrAllTest[index].knowledgePoint = testItems[j].knowledgePoint;
                    _arrAllTest[index].unableNumber = testItems[j].concernCount;
                    _arrAllTest[index].doExamNumber = testItems[j].explainCount;

                    _arrAllTest[index].ypercent = testItems[j].Ypercent;
                    _arrAllTest[index].ytopReply = testItems[j].YtopReply;

                    //  安卓
                    let androidTag = testItems[i] && testItems[i].AndroidTag ? testItems[i].AndroidTag : '';
                    let androidNote = testItems[i] && testItems[i].AndroidNote ? testItems[i].AndroidNote : '';
                    // 安卓end
					_arrAllTest[index].isShowExplain = false;
					_arrAllTest[index].spendTime = testItems[j].SpendTime ? testItems[j].SpendTime :0;
                    index++;
                } else {
                    G_Prg.
                    throw('程序运行错误，TestData._initArrAllTest ：testType = "' + testType + '"，无法解析题型');
                }
            }
        } //end for styleItem  
    }

    function getReplacePhoneID() {
        let json = null;
        if (window.android) {
            if (window.android.getListInfo) {
                json = window.android.getListInfo();
            }
        }
        if (!json) {
            return;
        }
        json = JSON.parse(json);
        if (!json.list) {
            return;
        }''
        let dataExam = {
            "ReturnMessage": "取数据成功",
            "StyleItems": [{
                "StyleID": 1,
                "Style": "单项选择题",
                "Explain": "单项选择题",
                "Score": 1,
                "Type": "ATEST",
                "TestCount": 1,
                "TestItems": [{
                    "ATestID": 16000004,
                    "AllTestID": 16000004,
                    "Title": "《百喻经》中有一则寓言：有一个愚人到别人家去做客，他嫌菜没有味道，主人就给他加了点盐，菜里加盐以后，味道好极了。愚人就想：“菜之所以鲜美，是因为有了盐。加一点点就如此鲜美，如果加更多的盐，岂不更加好吃？”回家之后，他把一把盐放进嘴里，结果又苦又咸。这则寓言给我们的启示是（）",
                    "Explain": "本题考查的是事物发展过程中的量变和质变中的“度”。度是质和量的统一，事物保持自己质的数量界限，即事物的范围、幅度和限度。题干中愚人想“加一点点盐就如此鲜美，如果加更多的盐，岂不是更好吃”结果是又苦又咸，超出的度，没有看到适度的原则。故本题的正确答案为B。",
                    "TestPoint": "略",
                    "SelectedItems": [],
                    "Answer": "",
                    "IsFav": 0,
                    "UserNoteContent": "这题真好"
                }]
            }]
        };
        let testItems = dataExam.StyleItems[0].TestItems;
        testItems.splice(0, 1); // 清空
        for (let i = 0; i < json.list.length; i++) {
            let lists = json.list[i];
            lists.subject = lists.subject.replace(/A/g, '<br />A. ');
            lists.subject = lists.subject.replace(/B/g, '<br />B. ');
            lists.subject = lists.subject.replace(/C/g, '<br />C. ');
            lists.subject = lists.subject.replace(/D/g, '<br />D. ');
            lists.subject = lists.subject.replace(/E/g, '<br />E. ');
            // alert(lists.subject);
            let obj = {
                "ATestID": Number(lists.id),
                "AllTestID": Number(lists.id),
                "Title": lists.subject,
                "Explain": "",
                "AndroidTag": lists.tag,
                "SelectedItems": [],
                "Answer": "",
                "IsFav": 0,
                "AndroidNote": lists.note
            }
            testItems.push(obj);
        }
        return dataExam;
    }

    function getKaoYanAppData(appID, appEName) {
        var params = {
            appID: appID,
            cptID: G_Prg.getQueryString('cptID'),
            guid: localStorage.getItem('guid')
        }
        var jsonData = ''; //试题json数据
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组
        var community = ""; // 存储研友错误率等
        var URL = '/api/exam/getChapterTestEx';
        var success = function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                //字符串转json对象
                // jsonData = JSON.parse(jsonObj.data.test);
                jsonData = jsonObj.data.test;
                arrUserTest = jsonObj.data.info;
                _isVip = jsonObj.data.isVip;
                _examHistoryID = jsonObj.data.examHistoryID;
                community = jsonObj.data.analysis;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
            } else if (jsonObj.status === 201) { //201 没有数据；
                G_Prg.throw('程序运行错误，没有您要查找的试题数据！');
            } else {
                G_Prg.throw('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "' + jsonObj.status + '"！');
            }
        };
        G_AjaxApi.post(URL, params, false, success);
        jsonData = G_SetTestInfo.replaceImgURL(jsonData); //设置图片路径
        jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData, arrUserTest); //添加用户笔记、收藏标记
        jsonData = G_SetTestInfo.setCommunityTest(jsonData, community); //添加研友错误率
        return jsonData;
    }

    function getShouCangData(appEName) {
        var params = {
            appEName: appEName,
            guid: localStorage.getItem('guid')
        }
        var jsonData = ''; //试题json数据
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组
        var community = ""; // 存储研友错误率等
        var URL = '/api/exam/getUserFav';
        var success = function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                //字符串转json对象
                // jsonData = JSON.parse(jsonObj.data.test);
                jsonData = jsonObj.data.test;
                arrUserTest = jsonObj.data.info;
                _isVip = jsonObj.data.isVip;
                _examHistoryID = jsonObj.data.examHistoryID;
                community = jsonObj.data.analysis;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
            } else if (jsonObj.status === 201) { //201 没有数据；
                G_Prg.throw('程序运行错误，没有您要查找的试题数据！');
            } else {
                G_Prg.throw('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "' + jsonObj.status + '"！');
            }
        };
        G_AjaxApi.post(URL, params, false, success);
        jsonData = G_SetTestInfo.replaceImgURL(jsonData); //设置图片路径
        jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData, arrUserTest); //添加用户笔记、收藏标记
        jsonData = G_SetTestInfo.setCommunityTest(jsonData, community); //添加研友错误率
        return jsonData;
    }

    function getErrorRankData() {
        var jsonData = ''; //试题json数据
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组
        var community = ""; // 存储研友错误率等
        var URL = '/api/exam/errorRankTest?appID=' + localStorage.getItem('AppID') + '&guid=' + localStorage.getItem('guid');
        var success = function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                //字符串转json对象
                // jsonData = JSON.parse(jsonObj.data.test);
                jsonData = jsonObj.data.test;
                arrUserTest = jsonObj.data.info;
                _isVip = jsonObj.data.isVip;
                _examHistoryID = jsonObj.data.examHistoryID;
                community = jsonObj.data.analysis;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
            } else if (jsonObj.status === 201) { //201 没有数据；
                G_Prg.throw('程序运行错误，没有您要查找的试题数据！');
            } else {
                G_Prg.throw('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "' + jsonObj.status + '"！');
            }
        };
        G_AjaxApi.get(URL, false, success);
        jsonData = G_SetTestInfo.replaceImgURL(jsonData); //设置图片路径
        jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData, arrUserTest); //添加用户笔记、收藏标记
        jsonData = G_SetTestInfo.setCommunityTest(jsonData, community); //添加研友错误率
        return jsonData;
    }

    function getRandomData() {
        var jsonData = ''; //试题json数据
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组
        var community = ""; // 存储研友错误率等
        var URL = '/api/tests/random?appID=' + localStorage.getItem('AppID') + '&guid=' + localStorage.getItem('guid');
        var success = function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                //字符串转json对象
                // jsonData = JSON.parse(jsonObj.data.test);
                jsonData = jsonObj.data.test;
                jsonData.StyleItems = jsonData.test;
                delete jsonData.test;
                arrUserTest = jsonObj.data.info;
                _isVip = jsonObj.data.isVip;
                _examHistoryID = jsonObj.data.examHistoryID;
                community = jsonObj.data.analysis;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
            } else if (jsonObj.status === 201) { //201 没有数据；
                G_Prg.throw('程序运行错误，没有您要查找的试题数据！');
            } else {
                G_Prg.throw('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "' + jsonObj.status + '"！');
            }
        };
        G_AjaxApi.get(URL, false, success);
        jsonData = G_SetTestInfo.replaceImgURL(jsonData); //设置图片路径
//      jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData, arrUserTest); //添加用户笔记、收藏标记
        jsonData = G_SetTestInfo.setReplyCount(jsonData, arrUserTest); //添加用户笔记、收藏标记
        jsonData = G_SetTestInfo.setCommunityTest(jsonData, community); //添加研友错误率
        return jsonData;
    }
    /********************************************************************************
    函数名：_getAllTestJSON
    功能：通过ajax获取指定章节试题json数据
    输入参数: appID 软件ID；
             callback 抛出异常后执行的回调函数
             flag 标记是不是执业护士的考前预测取题
    返回值：章节试题json数据
    创建信息：黎萍（2014-06-18）
    修改记录：黎萍（2014-06-25）软件名称和章节ID进行判断，如果为空抛出异常，同时跳出方法
    修改记录：黎萍（2014-06-26）将函数修改为TestData的私有函数
    修改记录：黎萍（2014-07-03） 增加接收数据arrUserTest ；修改status 判断
    修改记录：黎萍（2014-07-07）增加输入参数appID
             韦友爱（2014-07-23）添加参数callback
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getAllTestJSON(cptID, appID, callback, flag) {
        var userID = G_Cookie.getUserID() ? G_Cookie.getUserID() : -1;
        var userName = G_Cookie.getUserName();
        var guid = G_Cookie.getGuid(); //检验码
        var params = {
            appID: appID,
            cptID: cptID,
            userID: userID,
            userName: userName,
            guid: guid
        };
        var jsonData = ''; //试题json数据
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组
        var URL = '/api/exam/getChapterTest';
        var success = function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                //字符串转json对象
                jsonData = JSON.parse(jsonObj.data.test);
                arrUserTest = jsonObj.data.info;
                _isVip = jsonObj.data.isVip;
                _examHistoryID = jsonObj.data.examHistoryID;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常', callback);
            } else if (jsonObj.status === 201) { //201 没有数据；
                G_Prg.throw('程序运行错误，没有您要查找的试题数据！', callback);
            } else {
                G_Prg.throw('程序运行错误，不能处理，TestData._getAllTestJSON : getChapterTest: status = "' + jsonObj.status + '"！', callback);
            }
        };
        G_AjaxApi.post(URL, params, false, success);
        return jsonData;
    }
    /********************************************************************************
    函数名：_getAtest
    功能：获取Atest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getAtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的ATestID
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.title = testItems[testItemIndex].Title; //标题
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = testItems[testItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.errorReplyCount = testItems[testItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = testItems[testItemIndex].RightReplyCount; //答对
        oneTestShow.answer = testItems[testItemIndex].Answer; //答案
        oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
        oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项

        oneTestShow.ypercent = testItems[testItemIndex].Ypercent;
        oneTestShow.ytopReply = testItems[testItemIndex].YtopReply;

        oneTestShow.time = G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日'); //时间

        //  安卓
        if (testItems[testItemIndex].AndroidTag) {
            oneTestShow.androidTag = testItems[testItemIndex].AndroidTag || '';
        }

        if (testItems[testItemIndex].AndroidNote) {
            oneTestShow.androidNote = testItems[testItemIndex].AndroidNote || '';
        }
        // 安卓end

        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getA3test
    功能：获取A3test型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getA3test(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的A3TestID
        var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对A3题型的A3TestItemIndex
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;
        var A3TestItems = testItems[testItemIndex].A3TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.subTestType = styleItems[styleItemIndex].SubType === undefined ? '单项' : styleItems[styleItemIndex].SubType; //选项类型，值有：空，单项，多项，不定项
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.frontTitle = testItems[testItemIndex].FrontTitle; //共用主标题
        oneTestShow.isFav = A3TestItems[subTestItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = A3TestItems[subTestItemIndex].UserNoteContent; //是否收藏
        oneTestShow.subTestID = A3TestItems[subTestItemIndex].A3TestItemID;
        oneTestShow.errorReplyCount = A3TestItems[subTestItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = A3TestItems[subTestItemIndex].RightReplyCount; //答对
        oneTestShow.answer = A3TestItems[subTestItemIndex].Answer; //答案
        oneTestShow.title = A3TestItems[subTestItemIndex].Title; //小标题
        var explain = A3TestItems[subTestItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = A3TestItems[subTestItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.selectedItems = A3TestItems[subTestItemIndex].SelectedItems; //选项

        oneTestShow.ypercent = A3TestItems[subTestItemIndex].Ypercent;
        oneTestShow.ytopReply = A3TestItems[subTestItemIndex].YtopReply;

        oneTestShow.time = G_Prg.datetimeFormat(new Date(A3TestItems[subTestItemIndex].NoteTime), 'MM月dd日'); //时间

        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getBtest
    功能：获取Btest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getBtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的BTestID
        var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对B题型的BTestItemIndex
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;
        var BTestItems = testItems[testItemIndex].BTestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.subTestType = styleItems[styleItemIndex].SubType === undefined ? '单项' : styleItems[styleItemIndex].SubType; //选项类型，值有：空，单项，多项，不定项
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型定项
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //共用选项
        oneTestShow.isFav = BTestItems[subTestItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = BTestItems[subTestItemIndex].UserNoteContent; //用户笔记
        oneTestShow.subTestID = BTestItems[subTestItemIndex].BTestItemID;
        oneTestShow.errorReplyCount = BTestItems[subTestItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = BTestItems[subTestItemIndex].RightReplyCount; //答对
        oneTestShow.answer = BTestItems[subTestItemIndex].Answer; //答案
        oneTestShow.title = BTestItems[subTestItemIndex].Title; //小标题
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        //var explain = BTestItems[subTestItemIndex].Explain; //解题思路
        //oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = BTestItems[subTestItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值

        oneTestShow.ypercent = BTestItems[subTestItemIndex].Ypercent;
        oneTestShow.ytopReply = BTestItems[subTestItemIndex].YtopReply;

        oneTestShow.time = G_Prg.datetimeFormat(new Date(BTestItems[subTestItemIndex].NoteTime), 'MM月dd日'); //时间

        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getJDtest
    功能：获取JDtest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getJDtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的JDTestID
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.title = testItems[testItemIndex].Title; //标题
        oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = testItems[testItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.errorReplyCount = testItems[testItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = testItems[testItemIndex].RightReplyCount; //答对
        oneTestShow.answer = testItems[testItemIndex].Answer; //答案

        oneTestShow.ypercent = testItems[testItemIndex].Ypercent;
        oneTestShow.ytopReply = testItems[testItemIndex].YtopReply;

        oneTestShow.time = G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日'); //时间

        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getPDtest
    功能：获取PDtest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getPDtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的PDTestID
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.title = testItems[testItemIndex].Title; //标题
        oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = testItems[testItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.errorReplyCount = testItems[testItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = testItems[testItemIndex].RightReplyCount; //答对
        oneTestShow.answer = testItems[testItemIndex].Answer; //答案
        oneTestShow.time = G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日'); //时间
        selectedItems = [{ Content: "对", ItemName: "A" }, { Content: "错", ItemName: "B" }];
        oneTestShow.selectedItems = selectedItems; //选项

        oneTestShow.ypercent = testItems[testItemIndex].Ypercent;
        oneTestShow.ytopReply = testItems[testItemIndex].YtopReply;

        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getTKtest
    功能：获取TKtest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getTKtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的TKTestID
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.title = testItems[testItemIndex].Title; //标题
        oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = testItems[testItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.errorReplyCount = testItems[testItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = testItems[testItemIndex].RightReplyCount; //答对
        var answer = testItems[testItemIndex].Answer; //答案
        oneTestShow.answer = G_SetTestInfo.splitTKTestAnswer(answer); //先进行选项分隔
        oneTestShow.answerType = testItems[testItemIndex].AnswerType; //答案比较顺序
        oneTestShow.time = G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日'); //时间

        oneTestShow.ypercent = testItems[testItemIndex].Ypercent;
        oneTestShow.ytopReply = testItems[testItemIndex].YtopReply;
        
        return oneTestShow;
    }
    /********************************************************************************
    函数名：_getXtest
    功能：获取Xtest型题试题信息
    输入参数:curTest 当前试题数组
    返回值：单题试题对象
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
    修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
    修改记录：黎萍（2014-07-04） 增加试题信息：score
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    function _getXtest(curTest) {
        var oneTestShow = new OneTestShow();
        var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
        var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的XTestID
        oneTestShow.testNO = curTest.testNO;
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        var styleItems = _jsonAllTest.StyleItems;
        var testItems = styleItems[styleItemIndex].TestItems;

        oneTestShow.score = styleItems[styleItemIndex].Score; //分数
        oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
        oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
        oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
        oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
        oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
        oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
        oneTestShow.srcID = testItems[testItemIndex].SrcID; //来源ID
        oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
        oneTestShow.title = testItems[testItemIndex].Title; //标题
        oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
        oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
        var explain = testItems[testItemIndex].Explain; //解题思路
        oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
        var testPoint = testItems[testItemIndex].TestPoint; //考试重点
        oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
        oneTestShow.errorReplyCount = testItems[testItemIndex].ErrorReplyCount; //答错
        oneTestShow.rightReplyCount = testItems[testItemIndex].RightReplyCount; //答对
        oneTestShow.answer = testItems[testItemIndex].Answer; //答案
        oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项
        oneTestShow.time = G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'MM月dd日'); //时间

        return oneTestShow;
    }



    /********************************************************************************
    以下为公共变量、公共函数
     *******************************************************************************/

    /********************************************************************************
    函数名：getIsVip
    功能：获取标记是否是VIP用户的
    输入参数:无
    返回值：无
    创建信息：黎萍（2014-07-09）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getExamHistoryID = function() {
        return _examHistoryID;
    };
    /********************************************************************************
    函数名：getIsVip
    功能：获取标记是否是VIP用户的
    输入参数:无
    返回值：无
    创建信息：黎萍（2014-07-09）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getIsVip = function() {
        return _isVip;
    };
    /********************************************************************************
    函数名：getArrAllTest
    功能：获取试题结构体数组
    输入参数:无
    返回值：无
    创建信息：黎萍（2014-07-09）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getArrAllTest = function() {
        return _arrAllTest;
    };
    this.getOneAllTest = function(index) {
        return _arrAllTest[index];
    };
    /********************************************************************************
    函数名：getJsonAllTest
    功能：获取试题
    输入参数:无
    返回值：无
    创建信息：黎萍（2014-08-26）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getJsonAllTest = function() {
        return _jsonAllTest;
    };
    /********************************************************************************
    函数名：getCurIndex
    功能：获取当前试题的索引
    输入参数:无
    返回值：_index 当前试题的索引
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getCurIndex = function() {
        return _index; //试题的当前索引，从0开始
    };
    /********************************************************************************
    函数名：getTestCount
    功能：获取试题数量
    输入参数:无
    返回值： 试题数量
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getTestCount = function() {
        if (!_arrAllTest.length) {
            G_Prg.throw('试题数组为空');
        }
        return _arrAllTest.length; //试题数量
    };
    /********************************************************************************
    函数名：movePre
    功能：移动到上一题
    输入参数:无
    返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示“已经是第一题”
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.movePre = function() {
        if (_index <= 0) {
            return false;
        } else {
            _index--;
            return true;
        }
    };
    /********************************************************************************
    函数名：moveNext
    功能：移动到下一题
    输入参数:无
    返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示"已经是最后一题"
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.moveNext = function() {
        if (_index >= (_arrAllTest.length - 1)) {
            return false;
        } else {
            _index++;
            return true;
        }
    };
    /********************************************************************************
    函数名：move
    功能：移动到指定的答题卡上题号
    输入参数:index 试题数组索引
    返回值：成功返回true，如果已经是第一题则返回false
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.move = function(index) {
        if ((index < 0) || (index >= _arrAllTest.length)) {
            return false;
        } else {
            _index = index;
            return true;
        }
    };
    // 安卓
    this.getAndroidNote = function(index) {
        return _arrAllTest[_index].androidNote;
    };
    this.setAndroidNote = function(note) {
        _arrAllTest[_index].androidNote = note;
    };
    this.getAndroidTag = function(index) {
        return _arrAllTest[_index].androidTag;
    };
    this.setAndroidTag = function(tag) {
        _arrAllTest[_index].androidTag = tag;
    };
    /********************************************************************************
    函数名：setUserReply
    功能：设置用户的答案
    输入参数:   userReply 用户输入的答案
    返回值：无
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.setUserReply = function(userReply) {
        _arrAllTest[_index].userReply = userReply;
    };
    /********************************************************************************
    函数名：getUserReply
    功能：获取用户的答案
    输入参数:   index 试题数组索引
    返回值：用户的答案
    创建信息：黎萍（2014-06-10）
    修改记录：无
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getUserReply = function(index) {
        return _arrAllTest[index].userReply;
    };
    /********************************************************************************
    函数名：setIsRight
    功能：设置用户答题是否正确
    输入参数:   isRight 标记用户回答是否正确
    返回值：无
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加函数注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.setIsRight = function(isRight) {
        _arrAllTest[_index].isRight = isRight;
    };
    /********************************************************************************
    函数名：getIsRight
    功能：获取用户答题是否正确
    输入参数:   index 试题数组索引
    返回值：用户的答案
    创建信息：黎萍（2014-06-10）
    修改记录：无
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getIsRight = function(index) {
        return _arrAllTest[index].isRight;
    };

    this.setPoint = function(point) {
        _arrAllTest[_index].point = point;
    };
    this.getPoint = function(index) {
        return _arrAllTest[index].point;
    };
    this.setTag = function(tag) {
        _arrAllTest[_index].tag = tag;
    };
    this.getTag = function(index) {
        return _arrAllTest[index].tag;
    };
    /********************************************************************************
    函数名：setSelected
    功能：设置标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
    输入参数:   selected 标记值
    返回值：无
    创建信息：黎萍（2014-08-06）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.setSelected = function(selected) {
        _arrAllTest[_index].selected = selected;
    };
    /********************************************************************************
    函数名：getSelected
    功能：获取标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
    输入参数:   index 试题数组索引
    返回值：标记值
    创建信息：黎萍（2014-08-06）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getSelected = function(index) {
        return _arrAllTest[index].selected;
    };
    /********************************************************************************
    函数名：setState
    功能：设置用户操作试题的状态
    输入参数:   state 标记值
    返回值：无
    创建信息：黎萍（2014-09-01）
    修改记录：赵梦琦（2018-8-28）添加参数index 是当前试题号
    审查人：无
     *******************************************************************************/
    this.setState = function(state, flag,index) {
    	if(index){
    		_arrAllTest[index-1].lastState = _arrAllTest[index-1].state;
            _arrAllTest[index-1].state = state;
    	}else if (!flag) {
            _arrAllTest[_index].lastState = _arrAllTest[_index].state;
            _arrAllTest[_index].state = state;
        } else {
    		for (var i = 0; i < _arrAllTest.length; i++) {
                _arrAllTest[i].lastState = _arrAllTest[i].state;
                _arrAllTest[i].state = state;
            }
        }
    };
    /********************************************************************************
    函数名：getState
    功能：获取标记当前试题是否提交了答案
    输入参数:   index 试题数组索引
    返回值：标记值
    创建信息：黎萍（2014-09-01）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getState = function(index) {
        return _arrAllTest[index].state;
    };
    /********************************************************************************
    函数名：setAction
    功能：设置用户操作试题的动作
    输入参数:   actionName 操作试题的动作,flag 标记是否将所有试题都标记为此动作
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.setAction = function(actionName, flag) {
        if (!flag) {
            _arrAllTest[_index].lastAction = _arrAllTest[_index].action;
            _arrAllTest[_index].action = actionName;
        } else {
            for (var i = 0; i < _arrAllTest.length; i++) {
                _arrAllTest[i].lastAction = _arrAllTest[i].action;
                _arrAllTest[i].action = actionName;
            }
        }
    };
    /********************************************************************************
    函数名：recoverState
    功能：恢复用户之前操作试题的状态
    输入参数:   无
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.recoverState = function() {
        for (var i = 0; i < _arrAllTest.length; i++) {
            _arrAllTest[i].state = _arrAllTest[i].lastState;
        }
    };
    /********************************************************************************
    函数名：getLastState
    功能：获取用户上一个操作状态
    输入参数:   index 当前试题索引
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getLastState = function(index) {
        return _arrAllTest[index].lastState;
    };
    /********************************************************************************
    函数名：getLastState
    功能：获取用户上一个操作状态
    输入参数:   index 当前试题索引
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getLastAction = function(index) {
        return _arrAllTest[index].lastAction;
    };
    /********************************************************************************
    函数名：recoverAction
    功能：恢复用户之前的操作动作
    输入参数:   无
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.recoverAction = function() {
        for (var i = 0; i < _arrAllTest.length; i++) {
            _arrAllTest[i].action = _arrAllTest[i].lastAction;
        }
    };
    /********************************************************************************
    函数名：clearAction
    功能：清空用户之前的操作动作
    输入参数:   无
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.clearAction = function() {
        for (var i = 0; i < _arrAllTest.length; i++) {
            _arrAllTest[i].action = '';
            _arrAllTest[i].lastAction = '';
        }
    };
    /********************************************************************************
    函数名：getAction
    功能：获取用户当前试题的操作动作
    输入参数:   index 当前试题索引
    返回值：无
    创建信息：黎萍（2014-09-04）
    修改记录：无
    审查人：无
     *******************************************************************************/
    this.getAction = function(index) {
        return _arrAllTest[index].action;
    };
    /********************************************************************************
    函数名：setFav
    功能：设置用户是否收藏试题
    输入参数:   fav 收藏状态
    返回值：无
    创建信息：黎萍（2014-07-04）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.setFav = function(fav) {
        _arrAllTest[_index].fav = fav;
    };
    /********************************************************************************
    函数名：getFav
    功能：获取用户是否收藏试题
    输入参数:   index 试题数组索引
    返回值：试题收藏状态
    创建信息：黎萍（2014-07-04）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getFav = function(index) {
        return _arrAllTest[index].fav;
    };
    /********************************************************************************
    函数名：setUserNote
    功能：设置用户是否对试题做了笔记
    输入参数:   userNote 用户笔记
    返回值：无
    创建信息：黎萍（2014-07-04）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.setUserNote = function(userNote) {
        _arrAllTest[_index].userNote = userNote;
    };
    /********************************************************************************
    函数名：getUserNote
    功能：获取用户是否对试题做了笔记
    输入参数:   index 试题数组索引
    返回值：用户笔记
    创建信息：黎萍（2014-07-04）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getUserNote = function(index) {
        return _arrAllTest[index].userNote;
    };
    /********************************************************************************
    函数名：setTime
    功能：设置笔记时间
    输入参数:time  笔记时间
    返回值：无
    创建信息：韦友爱（2014-07-14）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.setTime = function(time) {
        _arrAllTest[_index].time = time;
    };
    /********************************************************************************
    函数名：getTime
    功能：设置笔记时间
    输入参数:index  试题数组索引
    返回值：添加试题笔记时间
    创建信息：韦友爱（2014-07-14）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getTime = function(index) {
        return _arrAllTest[index].time;
    };
    /********************************************************************************
    函数名：setSpendTime
    功能：设置答题时间
    输入参数:time  笔记时间
    返回值：无
    创建信息：赵梦琦（2018-09-14）
    审查人：无
    *******************************************************************************/
    this.setSpendTime = function(spendTime) {
        _arrAllTest[_index].spendTime = spendTime;
    };
    /********************************************************************************
    函数名：getSpendTime
    功能：设置答题时间
    输入参数:index  试题数组索引
    返回值：添加试题答题时间
    创建信息：赵梦琦（2018-09-14）
    修改记录：无
    *******************************************************************************/
    this.getSpendTime = function(index) {
        return _arrAllTest[index].spendTime;
    };
    /********************************************************************************
    函数名：calculateScores
    功能：计算分数
    输入参数：无
    返回值：返回考试结果，考试结果有：未做试题数，试题总数、已做试题数、答对试题数、正确率、成绩评定
    创建信息：黎萍（2014-05-23）
    修改记录：兰涛（2014-05-27）修改函数名称
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.calculateScores = function() {
        var testCount = _arrAllTest.length; //试题总数
        var doneNum = 0; //已做试题数
        var rightNum = 0; //答对试题数
        var notDoNum = 0; //未做试题数
        var correctRate = 0; //正确率
        //计算用户的总得分和试题满分
        var allScore = 0;
        var userScore = 0;
        for (var i = 0; i < testCount; i++) {
            if (_arrAllTest[i].userReply !== '' && _arrAllTest[i].isRight !== false) {
                doneNum++; //获取已做总数
            }
            if (_arrAllTest[i].isRight === 0) { //答对
                rightNum++; //获取答对总数
            }
            allScore += Number(_arrAllTest[i].score);
            if (_arrAllTest[i].isRight === 0) {
                userScore += Number(_arrAllTest[i].score); //用户的得分
            }
        }
        notDoNum = testCount - doneNum; //计算未做总数
        if (doneNum > 0) {
            correctRate = rightNum / testCount;
            correctRate = correctRate.toFixed(2); //保留两位小数
        }

        var scoreJSON = { doneNum: doneNum, rightNum: rightNum, correctRate: correctRate, testCount: testCount, notDoNum: notDoNum, allScore: allScore, userScore: userScore };
        return scoreJSON;
    };
    /********************************************************************************
    函数名：getTest
    功能：获取指定索引试题
    输入参数:   index 试题编号索引
    返回值：curTestShow 返回包含试题所有信息的结构体
    创建信息：黎萍（2014-05-28）
    修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getTest = function(index) {
        var curTest = _arrAllTest[index];
        if (_jsonAllTest === '' || _jsonAllTest === undefined) {
            return;
        }
        //如果超过了题目的索引返回null
        if (!curTest) {
            return null;
        }
        var testType = _jsonAllTest.StyleItems[curTest.styleItemIndex].Type; //根据试题编号获取试题所属题型
        var curTestShow = {};

        switch (testType) {
            case 'ATEST':
                curTestShow = _getAtest(curTest);
                break;
            case 'A3TEST':
                curTestShow = _getA3test(curTest);
                break;
            case 'BTEST':
                curTestShow = _getBtest(curTest);
                break;
            case 'JDTEST':
                curTestShow = _getJDtest(curTest);
                break;
            case 'PDTEST':
                curTestShow = _getPDtest(curTest);
                break;
            case 'TKTEST':
                curTestShow = _getTKtest(curTest);
                break;
            case 'XTEST':
                curTestShow = _getXtest(curTest);
                break;
            default:
                G_Prg.throw('程序运行错误，TestData.getTest：testType = "' + testType + '",无法解析数据');
        }
        return curTestShow;
    };
    /********************************************************************************
    函数名：getCurTest
    功能：获取当前试题
    输入参数:无
    返回值：curTestShow当前试题
    创建信息：兰涛（2014-05-28）
    修改记录：黎萍（2014-05-28） 增加注释，根据题型解析试题
    修改记录：黎萍（2014-06-26） 修改注释
    审查人：兰涛（2014-06-26）
     *******************************************************************************/
    this.getCurTest = function() {
        return this.getTest(_index);
    };

    /********************************************************************************
     函数名_addReplyJson
     功能：缓存试题并保存现场 
     输入参数:
     返回值：无
     创建信息：黎萍（2014-08-26）
     修改记录：无
     审查人：无
     *******************************************************************************/
    this.addReplyJson = function() {
        var userID = G_Cookie.getUserID();
        if (!userID) {
            return;
        }
        var url = '';
        if (_fromUrl === 'simulatedExam.html') {
            url = _fromUrl;
        }
        var doneTest = this.calculateScores();
        //未做试题数量为0，说明试题已经做完了，不需要进行现场的恢复
        if (doneTest.notDoNum === 0) {
            G_Storage.removeLocalStorageValue(userID + '_' + G_Cookie.getAppEName() + '_testJson');
            return;
        }
        var testNO = this.getCurTest().testNO;
        var testJson = { 'title': _title, 'curTestNO': testNO, 'isVip': _isVip, 'examHistoryID': this.getExamHistoryID(), 'url': url, 'jsonAllTest': _jsonAllTest, 'arrAllTest': _arrAllTest };
        G_Storage.setLocalStorageValue(userID + '_' + G_Cookie.getAppEName() + '_testJson', testJson);
    }
    /********************************************************************************
    函数名：setMyNote
    功能：连接到setUserNote接口，设置当前试题的笔记内容
    输入参数: appID 软件ID； userID 用户ID
             curTest 当前试题； note 笔记内容；cb 回调函数，用于处理页面
    返回值：无
    创建信息：韦友爱（2014-07-15）
    修改记录：韦友爱（2014-07-16）添加调用_setNoteTestInfos()
    审查人：无
     *******************************************************************************/
    this.setMyNote = function(curTest, note, appID, userID, userName, guid) {
        var childTableID = curTest.subTestID;
        var childTableName = curTest.testType;
        var allTestID = curTest.allTestID; //题目ID
        var styleID = curTest.styleID; //题型ID
        var cptID = curTest.cptID;
        var srcID = curTest.srcID;
        var sbjID = curTest.sbjID;
        var _this = this;
        if (note && note.length > 100) {
            note = note.substr(0, 100);
        }
        var _success = function(json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                if (note) {
                    _this.setUserNote(note);
                    _this.setTime('今天');
                } else {
                    _this.setUserNote(null);
                }
            } else if (jsonData.status === 201) {
                G_Prg.throw('程序运行错误，testData.setMyNote：status=' + jsonData.status + '更新笔记失败');
            } else {
                G_Prg.throw('程序运行错误，不能处理，testData.setMyNote：status=' + jsonData.status);
            }
        }
        var params = {
            appID: appID,
            userID: userID,
            cptID: cptID,
            allTestID: allTestID,
            childTableID: childTableID,
            childTableName: childTableName,
            srcID: srcID,
            sbjID: sbjID,
            styleID: styleID,
            noteContent: note,
            userName: userName,
            guid: guid
        };
        G_AjaxApi.asyncPost('/api/exam/addUserNote', params, true, _success);
    }
    /********************************************************************************
    函数名：addReplyLog
    功能：添加答题记录明细
    输入参数:userAnswer 用户的答案；isRight标记用户是否回答正确
            endTime:答题结束时间； starTime：答题开始时间
            spendTime 答题时长
    返回值：无
    创建信息：黎萍（2014-07-04）
    修改记录：廖黎
    审查人：无
    *******************************************************************************/
    this.addReplyLog = function(curTest, appID, userID, userName, guid, userAnswer, isRight, endTime, starTime, examType,spendTime) {
        var useTime = (endTime.getTime() - starTime.getTime()) / 1000;
        var childTableID = curTest.subTestID; //子表ID
        var childTableName = curTest.testType; //子表名称
        var allTestID = curTest.allTestID; //题目ID
        var styleID = curTest.styleID; //题型ID
        var cptID = curTest.cptID; //章节ID
        var srcID = curTest.srcID; //来源ID
        var sbjID = curTest.sbjID; //科目ID
        var score = curTest.score; //分数
        var lastUserReply = userAnswer; //用户的答案
        var lastUserScore = 0; //用户的得分
        if (isRight === 0) {
            lastUserScore = score;
        }
        var examHistoryID = this.getExamHistoryID();
        var params = {
            examHistoryID: examHistoryID,
            appID: appID,
            userID: userID,
            cptID: cptID,
            allTestID: allTestID,
            childTableID: childTableID,
            childTableName: childTableName,
            srcID: srcID,
            sbjID: sbjID,
            styleID: styleID,
            lastUserReply: lastUserReply,
            score: score,
            lastUserScore: lastUserScore,
            userName: userName,
            guid: guid,
            spendTime: Math.ceil(spendTime),
            examType: examType
        };
        G_AjaxApi.asyncPost('/api/exam/updateUserReply', params, true, function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                return;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "' + jsonObj.status + '"！', function() {
                    window.location.href = '/';
                });
            } else if (jsonObj.status === 400) {
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "' + jsonObj.status + '"！', function() {
                    window.location.href = '/';
                });
            } else {
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "' + jsonObj.status + '"！', function() {
                    window.location.href = '/';
                });
            }
        });
    }
    /********************************************************************************
    函数名：addFav
    功能：添加收藏
    输入参数:cb:执行成功后处理页面的回调函数
    返回值：无
    创建信息：韦友爱（2014-07-02）
    修改记录：黎萍（2014-07-04）修改提示信息
    审查人：无
    *******************************************************************************/
    this.addFav = function(curTest, appID, userID, userName, guid) {
        var _this = this;
        var dbSuccess = function(json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                _this.setFav(1); //收藏成功，将收藏状态修改到结构体数组中，供给上一题、下一题使用
            } else if (jsonData.status === 201) {
                G_Prg.throw('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status + '添加收藏失败');
            } else {
                G_Prg.throw('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status);
            }
        }
        var childTableID = curTest.subTestID;
        var childTableName = curTest.testType;
        var allTestID = curTest.allTestID; //题目ID
        var styleID = curTest.styleID; //题型ID
        var cptID = curTest.cptID;
        var srcID = curTest.srcID;
        var sbjID = curTest.sbjID;
        var params = { appID: appID, userID: userID, cptID: cptID, allTestID: allTestID, childTableID: childTableID, childTableName: childTableName, srcID: srcID, sbjID: sbjID, styleID: styleID, userName: userName, guid: guid };
        G_AjaxApi.asyncPost('/api/exam/addUserFav', params, true, dbSuccess);

    }
    /********************************************************************************
    函数名：removeFav
    功能：取消收藏
    输入参数: cb:执行成功后处理页面的回调函数
    返回值：无
    创建信息：韦友爱（2014-07-02）
    修改记录：黎萍（2014-07-04）修改提示信息
    审查人：无
    *******************************************************************************/
    this.removeFav = function(curTest, appID, userID, userName, guid) {
        var cptID = curTest.cptID;
        var allTestID = curTest.allTestID; //题目ID
        var childTableID = curTest.subTestID;
        var _this = this;
        var _success = function(json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                _this.setFav(0); //取消收藏，将收藏状态修改到结构体数组中，供给上一题、下一题使用
            } else {
                G_Prg.throw('程序运行错误，不能处理，testData.removeFav：status=' + jsonData.status);
            }
        }
        var params = { appID: appID, userID: userID, cptID: cptID, allTestID: allTestID, childTableID: childTableID, userName: userName, guid: guid };
        G_AjaxApi.asyncPost('/api/exam/deleteUserFav', params, true, _success);

    }
    /********************************************************************************
     函数名：updateChapterHistory
     功能：将批阅的成绩保存到数据库中
     输入参数：totalNum 试题总数,testNum 已答过的试题总数,rightTestNum 答对的试题总数
              startTime 答题开始时间， 
     返回值：无
     创建信息：黎萍（2014-07-16）
     修改记录：廖黎（2014-07-29）加入回调函数，用于数据处理完成后反馈至页面
     审查人：无
     *******************************************************************************/
    this.updateChapterHistory = function(curTest, appID, userID, cptName, totalNum, testNum, rightTestNum, startTime, examType, viewCount, allScore, userScore) {
        var replyEndTime = new Date();
        var useTime = (replyEndTime.getTime() - startTime.getTime()) / 1000;
        var cptID = curTest.cptID; //章节ID   
        var srcID = curTest.srcID; //来源ID
        var sbjID = curTest.sbjID; //科目ID
        var examHistoryID = this.getExamHistoryID();
        var params = {
            examHistoryID: examHistoryID,
            appID: appID,
            userID: userID,
            cptID: cptID,
            caption: cptName,
            replyStartTime: G_Prg.datetimeFormat(startTime, 'yyyy-MM-dd hh:mm:ss'),
            replySpendTime: Math.ceil(useTime),
            rightTestNum: rightTestNum,
            totalNum: totalNum,
            testNum: testNum,
            score: allScore,
            userScore: userScore,
            srcID: srcID,
            sbjID: sbjID,
            viewCount: viewCount,
            examType: examType
        };
        G_AjaxApi.post('/api/chapterHistory/updateChapterHistory', params, false, function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                return;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "' + jsonObj.status + '"！', function() {
                    location.reload(true);
                });
            } else if (jsonObj.status === 400) {
                G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "' + jsonObj.status + '"！', function() {
                    location.reload(true);
                });
            } else {
                G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "' + jsonObj.status + '"！', function() {
                    location.reload(true);
                });
            }
        });
    }
    /********************************************************************************
     函数名：_setExplain
     功能：生成包含题型以及该题型结束题号的数组
     输入参数: 无
     返回值: type 包含题型以及该题型结束题号的数组
     创建信息：韦友爱（2014-08-06）
     修改记录：无
     审查人：无
     *******************************************************************************/
    this.setExplain = function() {
        var arrAllTest = _arrAllTest;
        var type = [];
        var index = 0;
        if (arrAllTest.length === 1) {
            type[0] = {
                type: arrAllTest[0].type,
                startNO: 1,
                endNO: 1
            };
            return type;
        }
        for (var i = 0; i < arrAllTest.length - 1; i++) {
            var startNum = 1;
            if (index > 0) {
                startNum = type[index - 1].endNO + 1;
            }
            if (arrAllTest[i].style !== arrAllTest[i + 1].style) {
                var n = {
                    type: arrAllTest[i].type,
                    startNO: startNum,
                    endNO: i + 1
                };
                type[index] = n;
                index++;
                if (i === arrAllTest.length - 2) { //最后一题与前一题不同
                    var n = {
                        type: arrAllTest[i + 1].type,
                        startNO: type[index - 1].endNO + 1,
                        endNO: arrAllTest.length
                    };
                    type[index] = n;
                    break;
                }
            }
            if (i === arrAllTest.length - 2) { //最后一题与前一题相同
                var n = {
                    type: arrAllTest[i + 1].type,
                    startNO: startNum,
                    endNO: arrAllTest.length
                };
                type[type.length] = n;
                break;
            }
        }
        return type;
    }
    /********************************************************************************
    函数名：getTestNO
    功能：生成包含题型以及该题型结束题号的数组
    输入参数: allTestID 试题编号
    返回值: 题号
    创建信息：韦友爱（2014-09-10）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getTestNO = function(allTestID) {
        if (!allTestID) {
            return 1;
        }
        var arrContrast = _arrContrast;
        for (var i = 0; i < arrContrast.length; i++) {
            if (arrContrast[i] === allTestID) {
                return (i + 1);
            }
        }
        return 1;
    }
    /********************************************************************************
    函数名：getOtherUserNote
    功能：获取当前题其他用户的笔记
    输入参数: curTest 当前试题 ，index 当前试题在试题数组中的下标，
                curPage 当前页码(不为零说明是点击‘加载更多’)
    返回值: _arrOtherNote[index] 当前题其他用户的笔记
    创建信息：韦友爱（2014-09-17）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getOtherUserNote = function(curTest, index, curPage) {
        if (_arrOtherNote[index] && curPage === 0) {
            return (_arrOtherNote[index]);
        }
        if (curPage === 0) {
            _arrOtherNote[index] = {
                arrUserNote: [],
                noteCount: 0,
                curPage: 0
            };
        } else {
            curPage = _arrOtherNote[index].curPage + 1;
        }
        var otherUserNote = '';
        var allTestID = curTest.allTestID; //题目ID
        var childTableID = curTest.subTestID;
        var params = {
            appID: G_Cookie.getAppID(),
            allTestID: allTestID,
            userID: G_Cookie.getUserID(),
            childTableID: childTableID,
            curPage: curPage,
            guid: G_Cookie.getGuid(),
            eachNum: 3,
            userName: G_Cookie.getUserName()
        };
        G_AjaxApi.post('/api/exam/getOtherUserNote', params, false, function(json) {
            var otherNoteJson = JSON.parse(json);
            if (otherNoteJson.status === 200) {
                otherUserNote = otherNoteJson.data;
                var arrUserNote = otherUserNote.jsonOtherNote.Notes;
                for (var i = 0; i < arrUserNote.length; i++) {
                    _arrOtherNote[index].arrUserNote.push(arrUserNote[i]);
                }
                _arrOtherNote[index].noteCount = otherUserNote.otherUserNoteCount;
                _arrOtherNote[index].curPage = curPage;
            } else if (otherNoteJson.status === 201) {
                otherUserNote = '';
            } else if (otherNoteJson.status === 300) {
                G_Prg.throw('TestData. getOtherUserNote: 连接数据库失败');
            } else if (otherNoteJson.status === 400) {
                G_Prg.throw('TestData. getOtherUserNote: 参数有错');
            } else {
                G_Prg.throw('TestData. getOtherUserNote: 程序运行错误，不能处理status=' + otherNoteJson.status);
            }
        });
        return (_arrOtherNote[index]);
    }
    this.setOtherNote = function(index) {
        _arrOtherNote[index] = '';
    }
    this.isShowOtherNote = function(index) {
        if (_arrOtherNote[index]) {
            return true;
        }
        return false;
    }
    /********************************************************************************
    函数名：getCorrectRate
    功能：获取本章学习总人数和当前用户的击败率
    输入参数: 
    返回值: 无
    创建信息：黎萍（2014-10-23）
    修改记录：无
    审查人：无
    *******************************************************************************/
    this.getCorrectRate = function(appID, cptID, userCorrectRate, totalNum) {
        var params = {
            appID: appID,
            cptID: cptID,
            userCorrectRate: userCorrectRate,
            totalNum: totalNum
        };
        var infos = '';
        G_AjaxApi.post('/api/exam/getBelowCorrectRate', params, false, function(json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) { //200 获取数据成功
                infos = jsonObj.data;
            } else if (jsonObj.status === 300) { //300 连接数据库失败
                G_Prg.throw('程序运行错误，TestData.getCorrectRate:  status = "' + jsonObj.status + '"，连接数据库失败！', function() {
                    location.reload(true);
                });
            } else if (jsonObj.status === 400) {
                G_Prg.throw('程序运行错误，TestData.getCorrectRate : status = "' + jsonObj.status + '"，输入参数有误！', function() {
                    location.reload(true);
                });
            } else {
                G_Prg.throw('程序运行错误，不能处理 TestData.getCorrectRate : status = "' + jsonObj.status + '"！', function() {
                    location.reload(true);
                });
            }
        });
        return infos;
    }
     /********************************************************************************
	    函数名：setisShowExplain
	    功能：设置用户是否显示批阅数据
	    输入参数:   flag 是否批阅的标识
	    返回值：无
	    创建信息：赵梦琦（2018-09-04）
    *******************************************************************************/
    this.setisShowExplain = function(flag,index) {
    	if(index){
    		_arrAllTest[index].isShowExplain = flag;
    	}else{
    		_arrAllTest[_index].isShowExplain = flag;
    	}
        
    };
     /********************************************************************************
	    函数名：getisShowExplain
	    功能：获取用户是否显示批阅数据
	    输入参数:   index 当前试题
	    返回值：是否显示解析
	    创建信息：赵梦琦（2018-09-04）
    *******************************************************************************/
    this.getisShowExplain = function(index){
    	return _arrAllTest[index].isShowExplain;
    }
    this.setErrorReplyCount = function(count){
		_arrAllTest[_index].errorReplyCount = count;
	};
	this.getErrorReplyCount = function(index){
		return _arrAllTest[index].errorReplyCount;
	};
	this.setRightReplyCount = function(count){
		_arrAllTest[_index].rightReplyCount = count;
	};
	this.getRightReplyCount = function(index){
		return _arrAllTest[index].rightReplyCount;
	};
}
